package com.shiroha.user.service;

import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.service.IService;
import com.shiroha.common.pojo.dto.GroupMemberDTO;
import com.shiroha.user.pojo.GroupMember;

import java.util.List;
import java.util.UUID;

import static com.shiroha.user.pojo.table.Tables.GROUP_MEMBER;

public interface IGroupMemberService extends IService<GroupMember> {

    /**
     * 获取某个群组中所有成员的基本信息
     *
     * @param userId 访问者ID
     * @param groupId 群组ID
     * @return 成员信息列表
     */
    List<GroupMemberDTO> getAllGroupMembersByGroupId(UUID userId, Long groupId);

    /**
     * 添加用户到群组中
     * @param userId 请求者ID
     * @param groupId 群组ID
     * @param memberId 成员ID
     */
    boolean addGroupMemberToGroup(UUID userId, Long groupId, UUID memberId);

    /**
     * 设置成员为管理员
     * @param userId 请求者ID
     * @param groupId 群组ID
     * @param memberId 成员ID
     */
    boolean setAdminForGroup(UUID userId, Long groupId, UUID memberId);

    /**
     * 从群组中删除成员
     * @param userId 访问者ID
     * @param groupId 群组ID
     * @param memberId 成员ID
     */
    boolean deleteGroupMemberFromGroup(UUID userId, Long groupId, UUID memberId);

    /**
     * 用户是否是群组的管理员或群主
     * @param userId 用户ID
     * @param groupId 群组ID
     * @return 是否是群组的管理员或群主
     */
    boolean isAdminForGroup(UUID userId, Long groupId);

    /**
     * 退出群聊
     * @param userId 退出群聊
     * @param groupId 群组ID
     * @return 是否退出成功
     */
    default boolean leaveGroup(UUID userId, Long groupId) {
        QueryWrapper queryWrapper = QueryWrapper.create()
                .where(GROUP_MEMBER.GROUP_ID.eq(groupId))
                .and(GROUP_MEMBER.USER_ID.eq(userId));
        return remove(queryWrapper);
    }
}
